/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hardware;

import aplicacao.TelaSimulador;
import auxiliar.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Schettino
 */
public abstract class MemoriaSecundaria {

    private static int TAMANHO_PROCESSOS = 0;
    private static int TAMANHO_TP = 0;
    private static int espacoDisponivelTPSec = 0;
    private static List<TabelaDePaginasSec> tabelas = new ArrayList<TabelaDePaginasSec>();
    private static Quadro[] quadros;

    public MemoriaSecundaria() {
        quadros = new Quadro[TAMANHO_PROCESSOS];
    }

    public static int getTAMANHO() {
        return TAMANHO_PROCESSOS;
    }

    public static void setTAMANHO(int TAMANHO) {
        MemoriaSecundaria.TAMANHO_PROCESSOS = TAMANHO;
        MemoriaSecundaria.quadros = new Quadro[TAMANHO];
    }

    public static Quadro[] getQuadros() {
        return quadros;
    }

    public static void setQuadros(Quadro[] quadros) {
        MemoriaSecundaria.quadros = quadros;
    }

    public static int proximoQuadroDisponivel() {
        for (int i = 0; i < quadros.length; i++) {
            if (quadros[i].getPagina() == null) {
                return i;
            }
        }
        return -1;
    }

    public static int getEspacoDisponivelTPSec() {
        return espacoDisponivelTPSec;
    }

    public static void setEspacoDisponivelTPSec(int espacoDisponivelTPSec) {
        MemoriaSecundaria.espacoDisponivelTPSec = espacoDisponivelTPSec;
    }

    public static List<TabelaDePaginasSec> getTabelas() {
        return tabelas;
    }

    public static void setTabelas(List<TabelaDePaginasSec> tabelas) {
        MemoriaSecundaria.tabelas = tabelas;
    }

    public static int getTAMANHO_TP() {
        return TAMANHO_TP;
    }

    public static void setTAMANHO_TP(int TAMANHO_TP) {
        MemoriaSecundaria.TAMANHO_TP = TAMANHO_TP;
    }

    public static void adicionarProcesso(int id, int tam) {
        Processo processo = new Processo(id, tam);
        MemoriaPrincipal.adicionarTP(processo);
        TelaSimulador.getProcessos().add(processo);
        alocarProcesso(processo);
    }
//
//    public static void removerPagina(Pagina pagina) {
//        Processo processo = pagina.getProcesso();
//        int numPagina = processo.getPaginas().indexOf(pagina);
//        LinhaTPSec linha = processo.getTabelaDePaginasSec().getLinhas().get(numPagina);
//        Quadro quadro = MemoriaSecundaria.quadros[linha.getNumQuadro()];
//        quadro.setPagina(null);
//        TelaSimulador.tabelaMS.setValueAt(TelaSimulador.CELULA_VAZIA, linha.getNumQuadro(), TelaSimulador.COLUNA_NUM_PAGINA);
//        linha.setNumQuadro(-1);
//    }

    public static void atualizarPagina(Pagina pagina) {
        Processo processo = pagina.getProcesso();
        int numPagina = processo.getPaginas().indexOf(pagina);
        int numQuadro = processo.getTabelaDePaginasSec().getLinhas().get(numPagina).getNumQuadro();
        MemoriaSecundaria.quadros[numQuadro].setPagina(pagina);
        TelaSimulador.atualizaTabelaMS(pagina, MemoriaSecundaria.quadros[numQuadro]);
    }

    public static void alocarProcesso(Processo processo) {
        int prox = proximoQuadroDisponivel();
        int qtd = processo.getPaginas().size();
        for (int i = 0; i < qtd; i++) {
            if (prox == -1) {
                JOptionPane.showMessageDialog(null, "Espaço em memória secundária esgotado", "Erro", JOptionPane.ERROR_MESSAGE);
                return;
            }
            Pagina pagina = processo.getPaginas().get(i);
            LinhaTPSec linha = processo.getTabelaDePaginasSec().getLinhas().get(i);
            MemoriaSecundaria.quadros[prox].setPagina(pagina);

            TelaSimulador.atualizaTabelaMS(pagina, MemoriaSecundaria.quadros[prox]);
            linha.setNumQuadro(prox);
            prox = proximoQuadroDisponivel();
        }
        alocarTPSec(processo);
    }

    public static void alocarTPSec(Processo p) {
        TabelaDePaginasSec t = p.getTabelaDePaginasSec();
        int tamanho = t.getLinhas().size();
        if (MemoriaSecundaria.espacoDisponivelTPSec < tamanho) {
            JOptionPane.showMessageDialog(null, "Espaço em memória insuficiente", "Erro", JOptionPane.ERROR_MESSAGE);
        } else {
            MemoriaSecundaria.espacoDisponivelTPSec -= tamanho;
            MemoriaSecundaria.tabelas.add(t);
        }
    }
}
